#include "sstructure.h"
//
SStructure::SStructure(  ) 
	: QGraphicsScene()
{
	nEges = 0;
}

SNode* SStructure::getNode(QString nodeId)
{
	if (nodes.contains(nodeId))
	{
		return nodes[nodeId];
	}
	return 0;
}
//дает ссылку на ребро с меткой egeId
SEge* SStructure::getEge(QString egeId)
{
	QMap <QString,SEge*> eges = getEgesList();
	if (eges.contains(egeId)) return eges[egeId];
	return 0;
}

//дает ссылку на ребро идушее из from в to
SEge* SStructure::getEge(QString from, QString to)
{
	if ((nodes.contains(from))&&(nodes.contains(to)))
	{
		QMap<QString,SEge*>::iterator j = nodes[from]->to.begin();
		while (j != nodes[from]->to.end()) 
		{
			if (j.value()->to == nodes[to]) return j.value();
		}
	}
	return 0;
}

//Дает карту ребер
QMap <QString,SEge*> SStructure::getEgesList()
{
	QMap <QString,SEge*> list;
	
	QMap<QString,SNode*>::iterator k = nodes.begin();
	while (k != nodes.end())
	{
		QMap<QString,SEge*>::iterator i = k.value()->from.begin();
		while (i != k.value()->from.end()) 
		{
			list[i.key()] = i.value(); 
			++i;
		}

		QMap<QString,SEge*>::iterator j = k.value()->to.begin();
		while (j != k.value()->to.end()) 
		{
			list[j.key()] = j.value(); 
			++j;
		}
	}
	
	return list;
}

SNode* SStructure::addNode(qreal x,qreal y,QString label)
{
	SNode* Node = new SNode(label);
	Node->setPos(x,y);
	nodes.insert(label,Node);
	addItem(Node);
	
	return Node;
}

SEge* SStructure::addEge(QString from,QString to)
{
	if (nodes.contains(to)&&nodes.contains(from))
	{
		SEge * Ege = new SEge();
		Ege->to = nodes[to];
		Ege->from = nodes[from];
		nEges++;
		Ege->showControls();
		addItem(Ege);
		QString lab;
		lab = "e%1";
		lab = lab.arg(egesCount());
		nodes[to]->from.insert(lab,Ege);
		nodes[from]->to.insert(lab,Ege);
		Ege->updateControls();
		return Ege;
	}
	return 0;
}

const int SStructure::egesCount()
{
	return nEges;
}

const int SStructure::nodesCount()
{
	return nodes.size();
}
